"""
认识 字体反扒
概念：将关键性数据进行加密  但是 会通过浏览器 执行特定的解密方法（不涉及js逆向） 达到数据在浏览器网页渲染的一个效果
𘡸𘡷𘡴𘡲𘡸 𘡸𘡷𘡴𘡲𘡸 月票
不会在网页源代码里面进行正常的数据加载     反扒机制

目的 爬取中文起点网的月票数（反扒的字段）


指定流程
硬性思路
1.找到对应的 字体加密文件  保存到本地   字体包基本都是以woff后缀结尾
2利用第三方库 fontTools 把 字体文件的映射表 拿出来
pip install fontTools
3爬取网络上的 密文
4拿密文到映射表里面进行映射   （拿到明文）

tips
1 eto文件作用？
解决在网页中镶入特殊字符 字体的问题
2 woff文件作用
生成映射表    {密文：明文}
3ttf文件 作用
生成 特定的字体 字符
"""
import requests
import re
from fontTools.ttLib import TTFont
# 1.找到对应的 字体加密文件  保存到本地
url="https://www.qidian.com/rank/yuepiao/"
headers={
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.127 Safari/537.36",
    "cookie": "_yep_uuid=30fcc610-577e-e80d-8168-069487f40084; e1=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; e2=%7B%22pid%22%3A%22qd_P_rank_19%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A5%7D; newstatisticUUID=1648563576_1608577902; _csrfToken=ZUS3tFCcFDSs6vixclZ43SyOJTy2Cvx4AM9hpRCh; fu=1869177304; e1=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22qd_A06%22%2C%22l1%22%3A1%7D; e2=%7B%22pid%22%3A%22qd_p_qidian%22%2C%22eid%22%3A%22%22%2C%22l1%22%3A7%7D; _gid=GA1.2.454346901.1650885826; _ga_FZMMH98S83=GS1.1.1650892357.3.0.1650892357.0; _ga_PFYW0QLV3P=GS1.1.1650892357.3.0.1650892357.0; _ga=GA1.2.1432140425.1648563579",
}
# 发送请求
response=requests.get(url,headers)
data=response.content.decode()
print(data)
woff_url=re.findall("\); src: url\('(.*?)'\) format\('woff'\), url",data)[0]
# print(woff_url)
# 向woff文件发送请求
woff_res=requests.get(woff_url,headers=headers)
with open("月票.woff","wb")as f:
    f.write(woff_res.content)
# 通过 python的第三方库 fontTools将woff文件转换为 xml文件
fonts=TTFont("月票.woff")
# 保存为xml文件
fonts.saveXML("月票.xml")
# 通过fonts对象查看maps映射表
maps=fonts.getBestCmap()
print("maps",maps)
# maps {100368: 'two', 100370: 'five', 100371: 'period', 100372: 'eight', 100373: 'six', 100374: 'three', 100375: 'seven', 100376: 'zero', 100377: 'nine', 100378: 'one', 100379: 'four'}


# 3爬取网络上的 密文

midatas=re.findall('</style><span class=".*?">(.*?)</span></span>月票</p>',data)

booknames=re.findall(' alt="(.*?)在线阅读"></a> </div',data)
print(booknames)
midatalist=[]
for mttt in midatas:
    midata=mttt.replace("&#","").split(";")[0:-1]
    yuepiaonum = ""
    dic1 = {"zero": "0", "one": "1", "two": "2", "three": "3", "four": "4", "five": "5", "six": "6", "seven": "7",
                "eight": "8", "nine": "9"}
    for mi in midata:
        # 重点 进行数据类型转换
        miss=maps[int(mi)]
    #     手动构建 映射表  重点
        yuepiaonum+=(dic1[miss])
    print(yuepiaonum)
    midatalist.append(yuepiaonum)
for datasss in zip(booknames,midatalist):
    print(datasss)



"""
总结 字体反扒 
1获取woff文件 
2通过TTFont 生成 xml文件 再通过xml文件 拿到映射表 
3获取所有的 加密字体数据
4遍历每本书的加密字体列表  mi="密1 密2 密3 密4 密5"
5通过密文到映射表拿到英文数据   注意点 数据类型 
6手动构建映射表 
7英文数据 到手动构建映射表 进行二次映射  
8拿到数据                         
"""








